/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package objetos.personajes;

import objetos.Arma;
import java.util.ArrayList;
import mundo.Mapa;

/**
 *
 * @author cvasquez
 */
public class Bando {

    private int tipo; //0: Patriota / 1: Realista
    private int dinero;
    /**
     * El batallón cuyo atributo esPrincipal sea igual a 1
     * es el batallón principal del bando.
     */
   
    private PersonajePrincipal personajePrincipal;
    private int numRabonas;

    //Atributos agregados para funcionar con hilos
    private ArrayList<Personaje> personajes = new ArrayList<Personaje>();
    private String nombre;

    
    public Bando() {

    }

    // <editor-fold defaultstate="collapsed" desc="Constructor">
    /**
     * Este método será invocado por un objeto de clase GestorMapas para
     * eliminar los batallones del bando patriota y asignarle un nuevo batallón
     * principal de acuedo al nivel que se va a jugar en ese momento.
     */
    public void construyeBandoPatriota(int nivel) {
        switch (nivel) {
            case 0:
                {
                // Inicializa el bando patriota con 7 combatientes:
                // 4 indigenas, 2 rabonas y 1 personaje principal
                //this.tipo = 0;
                dinero = 1000000;

                //Añade personaje principal
                personajePrincipal = new PersonajePrincipal();
                personajePrincipal.setArmaDefensa(new Arma(0, 0, "escudo"));
                personajePrincipal.setArmaAtaque(new Arma(0, 1, "lanzon"));
                personajePrincipal.setArmaAtaque(new Arma(0, 1, "lanzon"));
                personajePrincipal.setBando(0);
                personajes.add(personajePrincipal);

//                //Añade indigenas
//                for (int i = 0; i < 2; ++i) {
//                    Indigena indigena1 = new Indigena();
//                    indigena1.setArmaDefensa(new Arma(4, 0, "tablon"));
//                    indigena1.setArmaAtaque(new Arma(4, 1, "piedras"));
//                    indigena1.setArmaAtaque(new Arma(4, 1, "rejones"));
//
//                    Indigena indigena2 = new Indigena();
//                    indigena2.setArmaDefensa(new Arma(4, 0, "tablon"));
//                    indigena2.setArmaAtaque(new Arma(4, 1, "rejones"));
//                    indigena2.setArmaAtaque(new Arma(4, 1, "hondas"));
//
//                    personajes.add(indigena1);
//                    personajes.add(indigena2);
//                }
//
//                //Añade rabonas
//                numRabonas = 2;
//                for (int i = 0; i < numRabonas; ++i) {
//                    Rabona rabona = new Rabona();
//                    personajes.add(rabona);
//                }
                break;
                }

            case 1:
                {
                //Para empezar el nivel 1, el dinero se mantiene constante
                // Inicializa el bando patriota con 8 combatientes:
                // 6 indigenas, 1 rabonas y 1 personaje principal
                personajes = new ArrayList<Personaje>();
                    
                //Añade personaje principal
                personajePrincipal = new PersonajePrincipal();
                personajePrincipal.setArmaDefensa(new Arma(0, 0, "escudo"));
                personajePrincipal.setArmaAtaque(new Arma(0, 1, "lanzon"));
                personajePrincipal.setArmaAtaque(new Arma(0, 1, "lanzon"));
                personajePrincipal.setBando(0);
                personajes.add(personajePrincipal);

//                //Añade indigenas
//                for (int i = 0; i < 3; ++i) {
//                    Indigena indigena1 = new Indigena();
//                    indigena1.setArmaDefensa(new Arma(4, 0, "tablon"));
//                    indigena1.setArmaAtaque(new Arma(4, 1, "piedras"));
//                    indigena1.setArmaAtaque(new Arma(4, 1, "rejones"));
//
//                    Indigena indigena2 = new Indigena();
//                    indigena2.setArmaDefensa(new Arma(4, 0, "tablon"));
//                    indigena2.setArmaAtaque(new Arma(4, 1, "rejones"));
//                    indigena2.setArmaAtaque(new Arma(4, 1, "hondas"));
//
//                    personajes.add(indigena1);
//                    personajes.add(indigena2);
//                }
//
//                //Añade rabonas
//                numRabonas = 1;
//                for (int i = 0; i < numRabonas; ++i) {
//                    Rabona rabona = new Rabona();
//                    personajes.add(rabona);
//                }
                break;
                }
        }

    }

    /**
     * Este método será invocado por un objeto de clase GestorMapas para
     * eliminar los batallones del bando realista y asignarle un nuevo batallón
     * principal de acuedo al nivel que se va a jugar en ese momento.
     */
    public void construyeBandoRealista(int nivel) {
        switch (nivel) {
            case 0:
                {
                // Inicializa el bando realista con 7 combatientes:
                // 2 artilleros, 2 soldados de caballeria, 1 soldados
                // de infanteria, 1 rabonas y 1 personaje principal
                dinero = 1500000;

                //Añade personaje principal
                personajePrincipal = new PersonajePrincipal();
//                personajePrincipal.setArmaDefensa(new Arma(0, 0, "escudo"));
//                personajePrincipal.setArmaAtaque(new Arma(0, 1, "lanzon"));
//                personajePrincipal.setArmaAtaque(new Arma(0, 1, "lanzon"));
                personajePrincipal.setBando(1);
                personajes.add(personajePrincipal);

//                //Añade artilleros
//                for (int i = 0; i < 7; ++i) {
//                    Artillero artillero = new Artillero();
//                    artillero.setArmaDefensa(new Arma(1, 0, "escudo"));
//                    artillero.setArmaAtaque(new Arma(1, 1, "cañon"));
//                    personajes.add(artillero);
//                }
//
//                //Añade soldados de caballeria
//                for (int i = 0; i < 4; ++i) {
//                    SoldadoDeCaballeria soldadoDeCaballeria = new SoldadoDeCaballeria();
//                    soldadoDeCaballeria.setArmaDefensa(new Arma(2, 0, "escudo"));
//                    soldadoDeCaballeria.setArmaAtaque(new Arma(2, 1, "caballeria"));
//                    personajes.add(soldadoDeCaballeria);
//                }
//
//                //Añade soldados de infanteria
//                for (int i = 0; i < 5; ++i) {
//                    SoldadoDeInfanteria soldadoDeInfanteria = new SoldadoDeInfanteria();
//                    soldadoDeInfanteria.setArmaDefensa(new Arma(3, 0, "escudo"));
//                    soldadoDeInfanteria.setArmaAtaque(new Arma(3, 1, "fusil"));
//                    personajes.add(soldadoDeInfanteria);
//                }
//
//                //Añade rabonas
//                numRabonas = 5;
//                for (int i = 0; i < numRabonas; ++i) {
//                    Rabona rabona = new Rabona();
//                    personajes.add(rabona);
//                }
                break;
                }

            case 1:
                {
                // Para empezar el nivel 1, el dinero se mantiene constante
                // Inicializa el bando realista con 28 combatientes:
                // 9 artilleros, 5 soldados de caballeria, 6 soldados
                // de infanteria, 7 rabonas y 1 personaje principal


                //TODO crear batallón principal
                personajes = new ArrayList<Personaje>();

                

                //Añade personaje principal
                personajePrincipal = new PersonajePrincipal();
//                personajePrincipal.setArmaDefensa(new Arma(0, 0, "escudo"));
//                personajePrincipal.setArmaAtaque(new Arma(0, 1, "lanzon"));
//                personajePrincipal.setArmaAtaque(new Arma(0, 1, "lanzon"));
                personajePrincipal.setBando(1);
                personajes.add(personajePrincipal);

//                //Añade artilleros
//                for (int i = 0; i < 9; ++i) {
//                    Artillero artillero = new Artillero();
//                    artillero.setArmaDefensa(new Arma(1, 0, "escudo"));
//                    artillero.setArmaAtaque(new Arma(1, 1, "cañon"));
//                    personajes.add(artillero);
//                }
//
//                //Añade soldados de caballeria
//                for (int i = 0; i < 5; ++i) {
//                    SoldadoDeCaballeria soldadoDeCaballeria = new SoldadoDeCaballeria();
//                    soldadoDeCaballeria.setArmaDefensa(new Arma(2, 0, "escudo"));
//                    soldadoDeCaballeria.setArmaAtaque(new Arma(2, 1, "caballeria"));
//                    personajes.add(soldadoDeCaballeria);
//                }
//
//                //Añade soldados de infanteria
//                for (int i = 0; i < 6; ++i) {
//                    SoldadoDeInfanteria soldadoDeInfanteria = new SoldadoDeInfanteria();
//                    soldadoDeInfanteria.setArmaDefensa(new Arma(3, 0, "escudo"));
//                    soldadoDeInfanteria.setArmaAtaque(new Arma(3, 1, "fusil"));
//                    personajes.add(soldadoDeInfanteria);
//                }
//
//                //Añade rabonas
//                numRabonas = 7;
//                for (int i = 0; i < numRabonas; ++i) {
//                    Rabona rabona = new Rabona();
//                    batallonPrincipal.agregarPersonaje(rabona);
//                }
                break;
                }
        }
    }

    /**
     * El constructor por defecto inicializará la cantidad de dinero inicial y
     * el batallón principal con personajes y armas iniciales. Estos valores
     * son distintos para el bando realista y el bando patriota.
     */
    public Bando(int tipo) {
        switch (tipo) {
            case 0:
                this.tipo = 0;
                this.nombre = "Bando Patriota";
                //dinero = 1000000;
                break;
            case 1:
                this.tipo = 1;
                this.nombre = "Bando Realista";
                //dinero = 1000000;
                break;
        }
    }// </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Getters y Setters">
/* Getters y Setters */

    public int getDinero() {
        return dinero;
    }

    public void setDinero(int dinero) {
        this.dinero = dinero;
    }

    public int getTipo() {
        return tipo;
    }

    public void setTipo(int tipo) {
        this.tipo = tipo;
    }

    public int getNumRabonas() {
        return numRabonas;
    }

    public void setNumRabonas(int numRabonas) {
        this.numRabonas = numRabonas;
    }

    public PersonajePrincipal getPersonajePrincipal() {
        return personajePrincipal;
    }

    public void setPersonajePrincipal(PersonajePrincipal personajePrincipal) {
        this.personajePrincipal = personajePrincipal;
    }

    public ArrayList<Personaje> getPersonajes() {
        return personajes;
    }

    public void setPersonajes(ArrayList<Personaje> personajes) {
        this.personajes = personajes;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Métodos de jugabilidad">
    /**
     * Evalúa si es posible asignarle esa arma a algún combatiente de ese
     * batallón, verificando que le alcance el dinero. Devuelve 1 si es
     * posible y 0 en caso contrario.
     */
    public boolean esPosibleComprarArma(Arma arma) {
        return (dinero > arma.getCosto());
    }

    /**
     * Evalúa si es posible comprar el personaje dependiendo de su costo y
     * los gastos de manutención en los cinco siguientes turnos.
     * @param personaje
     * @return
     */
    public boolean esPosibleComprarPersonaje(Personaje personaje) {
        return ( dinero > (personaje.getCosto()+5*personaje.getManutencion()) );
    }

    /**
     * Mejora la salud (vida actual) de los soldados del bando
     * según la cantidad de rabonas en él.
     */
    public void curacion() {
        int vidaRecuperada = numRabonas * ConstantesPersonajes.curacionRabona;
        int poblacionBando = personajes.size();
        //Calcula el aumento individual para cada personaje
        int aumentoIndividual = (int) vidaRecuperada/poblacionBando;
        //Recorre los personajes del bando y aumenta su vida
        for (Personaje personaje : personajes)
            personaje.aumentarVida(aumentoIndividual);
    }

    /**
     * Disminuye el dinero actual del bando debido a la manutención
     * de todos sus personajes.
     */
    public void manutencion() {
        int manutencion = 0;
        for (Personaje personaje : personajes)
            manutencion += personaje.getManutencion();
        dinero -= manutencion;
    }
    //</editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Métodos para funcionar con hilos">
    /**
     * Devuelve el ataque total de todos los combatientes seleccionados.
     * @return
     */
    public int ataqueSeleccionados() {
        int ataque = 0;
        for (Personaje personaje : personajes ) {
            if (personaje.isSeleccionado())
                ataque+=personaje.ataqueTotal();
        }
        return ataque;
    }

    /**
     * Devuelve la denfesa total de todos los combatientes seleccionados.
     * @return
     */
    public int defensaSeleccionados() {
        int defensa = 0;
        for (Personaje personaje : personajes ) {
            if (personaje.isSeleccionado())
                defensa+=personaje.defensaTotal();
        }
        return defensa;
    }

    /**
     * Devuelve el ataque total de todos los combatientes que están
     * siendo atacados.
     * @return
     */
    public int ataqueGrupoAtacado() {
        int ataque = 0;
        for (Personaje personaje : personajes ) {
            if (personaje.isAtacado())
                ataque+=personaje.ataqueTotal();
        }
        return ataque;
    }

    /**
     * Devuelve la denfesa total de todos los combatientes que están
     * siendo atacados.
     * @return
     */
    public int defensaGrupoAtacado() {
        int defensa = 0;
        for (Personaje personaje : personajes ) {
            if (personaje.isAtacado())
                defensa+=personaje.defensaTotal();
        }
        return defensa;
    }

    /**
     * Agrega los personajes al bando.
     * @param personajes Lista de personajes a agregar al bando.
     */
    public void agregarPersonajes(ArrayList<Personaje> personajes){
        for (int i=0; i<personajes.size();i++){
            this.getPersonajes().add(personajes.get(i));
        }
    }

    /**
     * Agrega el personaje al bando.
     * @param personaje
     */
    public void agregarPersonaje(Personaje personaje) {
        personajes.add(personaje);
        if (personaje.getTipoPersonaje()==5)
            numRabonas++;
    }

    /**
     * Devuelve verdadero si se realiza el gasto de dinero y este se
     * termina y falso si no se termina.
     * @param dineroGastado dinero a restar.
     * @return
     */
    public boolean restarDinero(int dineroGastado) {
        return ( (dinero -= dineroGastado) <= 0 )  ? true : false;
    }

    /**
     * Elimina el personaje del bando.
     * @param personajeAEliminar
     * @return
     */
    public boolean eliminarPersonajePostCombate(Personaje personajeAEliminar) {
        for (int i=0; i<personajes.size(); ++i)
            if (personajes.get(i).equals(personajeAEliminar)){
                personajes.remove(i);

                System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: "+ personajeAEliminar.getTipoPersonaje());
                if (personajeAEliminar == personajePrincipal)
                    return true;
            }
        return false;
    }

    /**
     * Devuelve el siguiente personaje en la lista del bando para
     * ser manejado por el usuario.
     * @param personajeActual Personaje que está siendo manejado actualmente.
     * @return
     */
    public Personaje getSiguientePersonaje(Personaje personajeActual) {
        //Si solo hay un personaje devuelve el mismo
        if ( personajes.size() == 1 ) {
            return personajeActual;
        }
            else {
                
                for (int i=0; i<personajes.size(); ++i) {
                    if (personajes.get(i).equals(personajeActual))
                        //Si manejaba el último personaje de la lista, ahora manejará al primero
                        if (i == (personajes.size()-1) ) {
                            return personajes.get(0);
                        }
                        //Caso contrario manejará al siguiente batallón de la lista
                        else {
                            return personajes.get(i+1);
                        }
                }
            }
        return personajeActual;
    }
    // </editor-fold>
}
